package com.heatup.apt.common.util.Netty;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.channel.socket.oio.OioSocketChannel;

import java.net.InetSocketAddress;

/**
 *
 * Created by blank on 2017/11/20 上午10:01
 */
public class BootstrapClient  {


    /**
     * eventClient
     * 1. 创建一个新的 Bootstrap 来创建和连接到新的客户端管道
     * 2. 指定 EventLoopGroup
     * 3. 指定 Channel 实现来使用
     * 4. 设置处理器给 Channel 的事件和数据
     * 5. 连接到远端主机
     */
    public static void eventClient(){

        EventLoopGroup group = new DefaultEventLoop();
        Bootstrap bootstrap = new Bootstrap(); //1
        bootstrap.group(group) //2
                .channel(NioSocketChannel.class)
                .handler(new SimpleChannelInboundHandler<ByteBuf>() { //4
                    @Override
                    protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
                        System.out.println("Received data");
                        byteBuf.clear();
                    }
                });

        ChannelFuture future = bootstrap.connect(
                new InetSocketAddress("apt.heatup.cn", 80));
        future.addListener(new ChannelFutureListener() {
            @Override
            public void operationComplete(ChannelFuture channelFuture) throws Exception {
                if (channelFuture.isSuccess()) {
                    System.out.println("Connection established");
                } else {
                    System.err.println("Connection attempt failed");
                    channelFuture.cause().printStackTrace();
                }
            }
        });

    }

    /**
     * 下面演示了引导客户端，使用的是 NIO TCP 传输
     *
     * 1. 创建新的 Bootstrap 来创建新的客户端管道
     * 2. 注册 EventLoopGroup 用于获取 EventLoop
     * 3. 指定要使用的 Channel 类。通知我们使用 NIO 版本用于 EventLoopGroup ， OIO 用于 Channel
     * 4. 设置处理器用于管道的 I/O 事件和数据
     * 5. 尝试连接到远端。当 NioEventLoopGroup 和 OioSocketChannel 不兼容时，会抛出 IllegalStateException 异常
     * 注意 Bootstrap 提供了一个“流利”语法——示例中使用的方法(除了connect()) 由 Bootstrap 返回实例本身的引用链接他们。
     */
    public static void bootstrapClientWithIncompatibleEventLoopGroup(){

        EventLoopGroup group = new NioEventLoopGroup();
        Bootstrap bootstrap = new Bootstrap(); //1
        bootstrap.group(group) //2
                .channel(OioSocketChannel.class) //3
                .handler(new SimpleChannelInboundHandler<ByteBuf>() { //4
                    @Override
                    protected void channelRead0(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf) throws Exception {
                        System.out.println("Revived data");
                        byteBuf.clear();
                    }
                });

        ChannelFuture future = bootstrap.connect(
                new InetSocketAddress("apt.heatup.cn", 80)); //5
        future.syncUninterruptibly();
    }





}
